package com.dinzeer.slashblade_useful_addon.events;

import com.dinzeer.legendreliclib.lib.util.slashblade.SlashBladeUtil;
import com.dinzeer.slashblade_useful_addon.config.Config;
import com.dinzeer.slashblade_useful_addon.Slashblade_useful_addon;

import mods.flammpfeil.slashblade.event.handler.InputCommandEvent;
import mods.flammpfeil.slashblade.item.ItemSlashBlade;
import net.minecraft.core.registries.Registries;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.damagesource.DamageSource;
import net.minecraft.world.damagesource.DamageTypes;
import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import mods.flammpfeil.slashblade.util.InputCommand;

import java.util.EnumSet;

/**
 * 特殊动作处理器类，用于处理玩家输入事件并触发特殊动作逻辑。
 * 主要功能：根据玩家输入组合（如前冲+冲刺+潜行或后退+冲刺+潜行），
 * 结合随机概率和武器类型，对玩家施加伤害或效果。
 */
@Mod.EventBusSubscriber(modid = Slashblade_useful_addon.MODID)
public class SpecialMoveHandler {

    /**
     * 单例模式持有者类，确保全局唯一实例。
     */
    private static final class SingletonHolder {
        private static final SpecialMoveHandler instance = new SpecialMoveHandler();
    }

    /**
     * 获取单例实例的方法。
     *
     * @return 返回当前类的唯一实例。
     */
    public static SpecialMoveHandler getInstance() {
        return SpecialMoveHandler.SingletonHolder.instance;
    }

    /**
     * 定义允许触发特殊动作的输入组合：前冲 + 冲刺 + 潜行。
     */
    final static EnumSet<InputCommand> fowerd_sprint_sneak = EnumSet.of(InputCommand.FORWARD, InputCommand.SPRINT,
            InputCommand.SNEAK);

    /**
     * 定义允许触发特殊动作的输入组合：后退 + 冲刺 + 潜行。
     */
    final static EnumSet<InputCommand> back_sprint_sneak = EnumSet.of(InputCommand.BACK, InputCommand.SPRINT,
            InputCommand.SNEAK);

    /**
     * 注册事件监听器到 Minecraft Forge 的事件总线。
     */
    public void register() {
        MinecraftForge.EVENT_BUS.register(this);
    }

    /**
     * 监听输入变化事件，判断是否满足触发条件并执行相应逻辑。
     *
     * @param event 输入变化事件对象，包含当前输入状态和玩家信息。
     */



    public  void onInputChangeSSTModule(InputCommandEvent event){
        // 获取当前输入组合和玩家实体
        EnumSet<InputCommand> current = event.getCurrent();
        ServerPlayer player = event.getEntity();


        if (isAllowedWeapon(player.getMainHandItem())  &&
                (current.containsAll(fowerd_sprint_sneak) || current.containsAll(back_sprint_sneak))) {

            // 计算最大生命值的 10% 作为扣血量
            float k = (float) (player.getMaxHealth() * 0.1);

            // 如果玩家当前生命值大于扣血量，则扣除部分生命值并移除再生效果
            if (player.getHealth() > k) {
                player.hurt(new DamageSource(player.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.GENERIC_KILL)), 1);
                player.setHealth(player.getHealth() - k);
                player.removeEffect(MobEffects.REGENERATION);
            } else {
                // 如果玩家生命值不足以扣除部分生命值，则直接造成致命伤害
                player.hurt(new DamageSource(player.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE).getHolderOrThrow(DamageTypes.GENERIC_KILL)), 4);
            }
        }
    }


    public  void onInputChanger(InputCommandEvent event){
        // 获取当前输入组合和玩家实体
        EnumSet<InputCommand> current = event.getCurrent();
        ServerPlayer player = event.getEntity();


        if (isAllowedWeapon(player.getMainHandItem())  &&
                (current.containsAll(fowerd_sprint_sneak) || current.containsAll(back_sprint_sneak))) {

              if (player.experienceLevel>=6){
               player.experienceLevel=player.experienceLevel-6;
              }else if (SlashBladeUtil.getproudSoul(player.getMainHandItem())>300){
                  SlashBladeUtil.getState(player.getMainHandItem()).setProudSoulCount(
                          SlashBladeUtil.getproudSoul(player.getMainHandItem())-300
                  );
              }else {
                  player.hurt(new DamageSource(player.level().registryAccess().registryOrThrow(Registries.DAMAGE_TYPE)
                          .getHolderOrThrow(DamageTypes.GENERIC_KILL)), 1);

              }

        }
    }




    @SubscribeEvent
    public void onInputChange(InputCommandEvent event) {
        if (Config.VXV_SST.get()){
            onInputChangeSSTModule(event);
        }else {
            onInputChanger(event);
        }
    }

    /**
     * 判断玩家主手装备是否为允许触发特殊动作的武器。
     *
     * @param itemStack 玩家主手装备的物品堆栈。
     * @return 如果是允许的武器返回 true，否则返回 false。
     */
    private static boolean isAllowedWeapon(ItemStack itemStack) {
        if (Config.VXV.get()==false){
            return false;
        }
        return aBoolean(itemStack);
    }

    /**
     * 辅助方法，判断物品堆栈是否为 ItemSlashBlade 类型。
     *
     * @param itemStack 待检查的物品堆栈。
     * @return 如果是 ItemSlashBlade 类型返回 true，否则返回 false。
     */
    private static boolean aBoolean(ItemStack itemStack) {
        if (itemStack.getItem() instanceof ItemSlashBlade) {
            return true;
        }
        return false;
    }
}